Control estadístico de procesos
Introducción a R
Jordi Cuadros, Lucinio González
Diciembre de 2017

Elementos básicos de R

R

R es un entorno y un lenguaje de programación estadística.

Es una de las herramientas más usadas en el análisis de datos. Es de código libre, su uso es gratuito y dispone de una comunidad muy activa que contribuye al desarrollo de herramientas y funciones adicionales (más de 10.000 paquetes) y a la resolución de preguntas a través de la red.

https://www.r-project.org/about.html https://www.rdocumentation.org/ https://stackoverflow.com/questions/tagged/r

Instalación de R y RStudio

R como herramienta de cálculo

R puede usarse desde la consola introduciendo directamente las instrucciones correspondientes.

2 + 3 
## [1] 5
8 ^ 10
## [1] 1073741824
log(100) # Logaritmo neperiano
## [1] 4.60517

# indica que lo que sigue es un comentario

Uso de scripts

Un script en R es un conjunto de instrucciones escritas en un archivo de texto, de forma que estás puedan almacenarse y ejecutarse con posterioridad. Se suelen almacenar con la extensión .R.

Un editor muy recomendado para la creación, ejecución y depuración de estos scripts es RStudio.

Acceso a la ayuda

  • Buscar ayuda sobre una función
? "mean"
  • Buscar un texto en la ayuda
?? "anova"

En RStudio, se puede seleccionar y pulsar F1 para buscar en la ayuda

Datos básicos

  • numeric: número decimal de 15 dígitos significativos
  • integer: entero de 32 bits (hasta 2·109 aprox.)
  • logical: TRUE o FALSE
  • character: cadena de caracteres de longitud indeterminada

Datos básicos – numeric

a <- 2
a
## [1] 2
class(a)
## [1] "numeric"
b <- 13.6788956789
b
## [1] 13.6789
class(b)
## [1] "numeric"
print(b, digits = 10)
## [1] 13.67889568

Operadores más comunes para datos de tipo numeric

Suma +
Resta -
Producto *
División /
Potencia ^ o **
Módulo (residuo) %%
División entera %/%
Comparaciones == > < >= <= !=
a+b
## [1] 15.6789
a-b
## [1] -11.6789
a*b
## [1] 27.35779
a^b
## [1] 13114.69
a/b
## [1] 0.1462106

Datos básicos – integer

Permite almacenar números enteros. Es el tipo de datos usado para contadores e índices.

n <- as.integer(340000)
class(n)
## [1] "integer"
n <- 2L
class(n)
## [1] "integer"

Datos básicos – character

Permite almacenar cadenas de texto de longitud indeterminada.

Los literales se indican entre comillas dobles (o simples).

a <- "aaa"
b <- "bbb"

paste(a, b, "hola", sep = ", ") 
## [1] "aaa, bbb, hola"

Operadores más comunes para datos de tipo character

Comparaciones == > < >= <= !=

Datos básicos – logical

Almacena valores que son verdadero (TRUE) o falso (FALSE).

Es el resultado de una comparación.

3 == 2
## [1] FALSE
b <- 3 != 2 
b
## [1] TRUE

Operadores más comunes para datos de tipo logical

Intersección lógica &
Unión lógica |
Negación lógica !
Comparaciones == !=

Por ejemplo…

a <- TRUE
b <- F
a & b # Operador AND
## [1] FALSE
a | b # Operador OR
## [1] TRUE
!b  # Operador NOT
## [1] TRUE

Conversión a datos básicos

Las funciones de conversión de tipos en R se indican como as. seguido del tipo de dato de destino.

as.character(2)
## [1] "2"
as.numeric(TRUE)
## [1] 1

Para saber si una información o variable es de un tipo determinado puede usarse is. seguido del tipo de dato a comprobar.

Constantes

R incorpora algunas constantes preestablecidas como

pi
## [1] 3.141593
Inf
NaN
NA
NULL

También existen funciones para evaluar si un dato corresponde a una de estas constantes.

is.na(3)
## [1] FALSE
is.null(NULL)
## [1] TRUE
is.infinite(-Inf)
## [1] TRUE

Datos compuestos

  • Principales
    • Vector
    • Factor
    • Data frame (Tabla de datos)
  • Otros tipos comunes
    • Factor ordenado
    • Lista
    • Matriz

Datos compuestos – vector

a <- c(2, 3, 4)
str(a)
##  num [1:3] 2 3 4
a[2]
## [1] 3

Las operaciones se aplican a vectores y devuelven vectores

a + a 
## [1] 4 6 8
a > 2.5
## [1] FALSE  TRUE  TRUE

Atención al reciclaje de datos…

a <- c(2, 3, 4)
b <- c(10, 20)
a * b
## Warning in a * b: longer object length is not a multiple of shorter object
## length
## [1] 20 60 40

Las funciones en R suelen ser vectoriales

  • algunas devuelven vectores
a <- c(2, 3, 4)
abs(sin(a))
## [1] 0.9092974 0.1411200 0.7568025
exp(a)
## [1]  7.389056 20.085537 54.598150
  • otras devuelven valores agregados
length(a)
## [1] 3
sum(a)
## [1] 9
mean(a)
## [1] 3

También sd, max, min

Puede determinarse si un valor está presente en un vector con el operador %in%.

a <- c(2, 3, 4)
3 %in% a
## [1] TRUE
c(2,5,3,4) %in% a
## [1]  TRUE FALSE  TRUE  TRUE

Existen estructuras especificas para crear vectores secuencia.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
seq(1, 10, by = 2)
## [1] 1 3 5 7 9
seq(1, 3, length.out = 5) 
## [1] 1.0 1.5 2.0 2.5 3.0

Los vectores se ordenan usando las funciones sort y order.

a <- c(8, 2, 5, 3)
sort(a)
## [1] 2 3 5 8
a[order(a)]
## [1] 2 3 5 8
a[order(a,decreasing = T)]
## [1] 8 5 3 2

Datos compuestos – factor

Un factor es un vector de cadenas indexado. Normalmente se crea a partir del vector de cadenas de texto.

a <- c("hola", "adeu","hola", "adeu", "adeu", "bye")
b <- as.factor(a)
as.character(b)
## [1] "hola" "adeu" "hola" "adeu" "adeu" "bye"
as.numeric(b)
## [1] 3 1 3 1 1 2
str(b)
##  Factor w/ 3 levels "adeu","bye","hola": 3 1 3 1 1 2

La función factor permite la codificación o recodificación manual de un vector.

a <- factor(c(3, 1, 3, 1, 1, 2), labels = c("adeu", "bye", "hola"))
a
## [1] hola adeu hola adeu adeu bye 
## Levels: adeu bye hola
levels(a)
## [1] "adeu" "bye"  "hola"

Datos compuestos – data frame

dfA <- data.frame(int = 1:10,
                  let = sample(letters, 10, replace = TRUE), 
                  ran = rnorm(10))
dfA
##    int let         ran
## 1    1   v  0.29960808
## 2    2   z  0.83836620
## 3    3   e  0.07921012
## 4    4   x  0.24917894
## 5    5   p -1.38040089
## 6    6   y -0.71291163
## 7    7   y -0.13931512
## 8    8   g -0.38800423
## 9    9   e -0.28194017
## 10  10   f  0.02638425
dim(dfA) # Dimensión
## [1] 10  3
nrow(dfA) # Número de columnas
## [1] 10
ncol(dfA) # Número de filas
## [1] 3
str(dfA)
## 'data.frame':    10 obs. of  3 variables:
##  $ int: int  1 2 3 4 5 6 7 8 9 10
##  $ let: Factor w/ 8 levels "e","f","g","p",..: 5 8 1 6 4 7 7 3 1 2
##  $ ran: num  0.2996 0.8384 0.0792 0.2492 -1.3804 ...
head(dfA, 3) # Primeros datos, 6 por defecto
##   int let        ran
## 1   1   v 0.29960808
## 2   2   z 0.83836620
## 3   3   e 0.07921012
tail(dfA, 2) # Últimos valores
##    int let         ran
## 9    9   e -0.28194017
## 10  10   f  0.02638425

Para acceder a los datos almacenados en el data frame se usan índices. Las variables de data frame también pueden extraerse usando su nombre.

dfA[2,3]
## [1] 0.8383662
dfA[,1]
##  [1]  1  2  3  4  5  6  7  8  9 10
dfA$let
##  [1] v z e x p y y g e f
## Levels: e f g p v x y z

Veremos más formas de acceder y usar los datos de una tabla de datos más adelante.

Más datos compuestos – lista

a <- list(2, "2", FALSE)
b <- list(3, "hola", c(2, 3, 4))
a
## [[1]]
## [1] 2
## 
## [[2]]
## [1] "2"
## 
## [[3]]
## [1] FALSE
b
## [[1]]
## [1] 3
## 
## [[2]]
## [1] "hola"
## 
## [[3]]
## [1] 2 3 4
length(a)
## [1] 3
a[[3]]
## [1] FALSE
b[[3]][1]
## [1] 2
 

str(b)
## List of 3
##  $ : num 3
##  $ : chr "hola"
##  $ : num [1:3] 2 3 4

Más datos compuestos – factor ordenado

notes <- c("Aprovat", "Insuficient", "Notable", "Insuficient",
           "Notable", "Excel·lent", "Aprovat")
notes <- factor(notes,
        levels = c("Insuficient", "Aprovat",
                   "Notable", "Excel·lent"),
        ordered = TRUE)
str(notes)
##  Ord.factor w/ 4 levels "Insuficient"<..: 2 1 3 1 3 4 2
levels(notes)
## [1] "Insuficient" "Aprovat"     "Notable"     "Excel·lent"

Más datos compuestos – matriz

a <- matrix(c(2, 4, -3, 5), ncol = 2)
a
##      [,1] [,2]
## [1,]    2   -3
## [2,]    4    5
a[2,2]
## [1] 5
a * a # Producto posición por posición
##      [,1] [,2]
## [1,]    4    9
## [2,]   16   25
a %*% a # Producto matricial
##      [,1] [,2]
## [1,]   -8  -21
## [2,]   28   13
t(a) # Transposición
##      [,1] [,2]
## [1,]    2    4
## [2,]   -3    5

Instalación y carga de paquetes en R

R tiene muchos paquetes para resolver problemas específicos. Para usar un paquete adicional este debe instalarse y cargarse en memoria.

installed.packages()[,1] # Lista los paquetes instalados
(.packages()) # Lista los paquetes en memoria

Dos recursos importantes para buscar y identificar paquetes relevantes son https://www.rdocumentation.org/ https://cran.rstudio.com/web/views/

Para instalar un paquete, por ejemplo “nycflights13”

install.packages("nycflights13")

Para cargar un paquete en memoria, se usa

library("nycflights13")

En RStudio la gestión de paquetes también puede hacerse desde la interfaz del programa

En un script y para garantizar la disponibilidad de un paquete

if(!require("nycflights13")) {
  install.packages("nycflights13")
  library("nycflights13")
}

Para acceder a la documentación de un paquete

help(package="nycflights13")

Algunos paquetes tienen información adicional a la que se puede acceder con las funciones vignette() y demo().

Gráficos en R

¿Para qué usamos los gráficos?

La principales funciones de los gráficos en el análisis de datos son

  • explorar los datos y facilitar su comprensión,
  • permitir el descubrimiento de patrones no evidentes, y
  • comunicar efectivamente los resultados de los análisis.

Gráficos en R

Veremos dos paradigmas distintos para la creación de gráficos en R.

  • Gráficos creados con el paquete base.
  • Gráficos creados en base a la gramática de gráficos (GoG), usando el paquete ggplot2

Gráficos en base R

Los gráficos en base R se construyen a partir de datos en vectores y usando funciones específicas en función del gráfico a realizar.

Para ejemplificar algunas de estas funciones, usaremos el conjunto de datos mtcars, que forma de los paquetes básicos de R.

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
head(mtcars, 10)
##                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

Veremos como crear

  • gráficos de dispersión,
  • histogramas,
  • diagramas de barras, y
  • diagramas de caja (boxplot)

Gráficos en base R – gráfico de dispersión

plot(mtcars$disp,mtcars$hp)

Gráficos en base R – histograma

hist(mtcars$disp)

Añadiendo una curva de densidad…

hist(mtcars$disp,breaks=20,freq=FALSE)
lines(density(mtcars$disp))

Gráficos en base R – diagrama de barras

barplot(table(as.factor(mtcars$cyl)))

Gráficos en base R – diagrama de caja

boxplot(mtcars$disp)
points(mean(mtcars$disp))

Gramática de gráficos (GoG)

La gramática de gráficos es una aproximación teórica al estudio de los componentes de un gráfico. De acuerdo con este análisis, un gráfico se puede construir mediante la especificación de un conjunto de capas y componentes que definen los datos, la asociación de los mismos a aspectos del gráfico, la especificación de la relación entre los valores de las variables de los datos con las del gráfico, la estructura geométrica del gráfico…

Wilkinson, L. (2006). The grammar of graphics. Springer Science & Business Media.

ggplot2

ggplot2 es un paquete de R que implementa de la gramática de gráficos.

Wickham, H. (2010). A layered grammar of graphics. Journal of Computational and Graphical Statistics, 19(1), 3-28.

Referencias:

ggplot2 forma parte del paquete tidyverse (aunque también puede instalarse y cargarse autónomamente).

if(!require("tidyverse")) {
  install.packages("tidyverse")
  library("tidyverse")
}

ggplot2 – capas y elementos del gráfico

En ggplot2 cada elemento gráfico que representa un conjunto de datos constituye una capa. Una o más capas constituyen un gráfico.

Cada capa queda definida mediante la especificación de sus elementos. Los principales son

  • datos,
  • mapeado estético, y
  • geometrías

En ggplot2, los gráficos constituyen un objeto de R y se construyen de forma aditiva.

Por ejemplo,

grafico <- ggplot(data = anscombe,
        mapping = aes(x = x1, y = y1))  # Datos y mapeado estético 
grafico <- grafico + geom_point()       # Geometría

grafico

ggplot2 – datos

En ggplot2, el elemento data (datos) se introduce como primer argumento de la función ggplot. Debe corresponder a una tabla de datos o un tipo de datos convertible a tabla de datos.

grafico <- ggplot(data = anscombe,

ggplot2 – mapeado estético

El mapping (mapeado estético) corresponde al establecimiento de relaciones entre variables de los datos y variables del gráfico. Es el segundo argumento de la función ggploty debe crearse con al función de apoyo aes.

        mapping = aes(x = x1, y = y1))

Para variables cuantitativas, los mapeados más comunes corresponden a

  • posiciones: x, y
  • tamaño: size
  • color: color, fill

Para variable cualitativas, los mapeados más frecuentes son

  • posiciones: x, y
  • color: color, fill
  • forma: shape

ggplot2 – geometrías

Las geometrías (geom_) indican la forma que debe tener el gráfico, es decir, cómo se articulan las variables del gráfico. Se añaden al gráfico sumándose al objeto creado por ggplot.

grafico <- grafico + geom_point()

Son geometrías de uso común

  • geom_point
  • geom_line, geom_vline, geom_hline
  • geom_bar
  • geom_histogram
  • geom_boxplot

Un resumen de las geometrías y su relación con las variables del gráfico que reconoce cada una de ellas figura en https://github.com/rstudio/cheatsheets/raw/master/data-visualization-2.1.pdf.

Gráficos en ggplot2

Veremos cómo crear en ggplot2 los gráficos más habituales, añadiendo algunas consideraciones para aquellos casos donde los gráficos realizados con base tienen prestaciones insuficientes.

  • gráficos de dispersión,
  • histogramas,
  • diagramas de barras, y
  • diagramas de caja (boxplot).

De forma general, los gráficos en ggplot2 se construyen a partir de tablas de datos (data frames), de los cuales se seleccionan las variables a representar.

Usaremos 1000 datos del conjunto de datos diamonds para crear los distintos ejemplos.

diaM <- diamonds[sample(1:nrow(diamonds),1000),]
str(diaM)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1000 obs. of  10 variables:
##  $ carat  : num  0.33 0.7 0.73 1.23 0.54 0.9 0.32 0.57 0.35 0.3 ...
##  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 3 4 3 5 4 5 4 5 5 ...
##  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 1 2 3 5 4 2 2 2 4 ...
##  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 6 2 2 5 4 4 3 3 3 8 ...
##  $ depth  : num  61.2 63.3 61.8 59.3 61.9 60 61.9 58.9 60.9 61.6 ...
##  $ table  : num  56 57 58 59 56 59 55 59 55 53 ...
##  $ price  : int  814 2354 2278 10609 1359 4424 559 1406 614 863 ...
##  $ x      : num  4.44 5.64 5.76 6.98 5.24 6.3 4.4 5.41 4.53 4.32 ...
##  $ y      : num  4.48 5.6 5.71 7.01 5.26 6.23 4.43 5.35 4.57 4.35 ...
##  $ z      : num  2.73 3.56 3.54 4.15 3.25 3.76 2.73 3.17 2.77 2.67 ...

Gráficos en ggplot2 – gráfico de dispersión

ggplot(diaM, aes(x=carat,y=price)) + geom_point()

Añadiendo una tercera variable (cut) y modificando algunos aspectos de formato…

ggplot(diaM, aes(x=carat,y=price,color=cut)) + 
  geom_point(alpha=.8,shape=21,size=3)

Añadiendo líneas de tendencia…

ggplot(diaM, aes(x=carat,y=price,color=cut)) + 
  geom_point(alpha=.8,shape=21,size=3) +
  geom_smooth(method="lm",se=FALSE)

Gráficos en ggplot2 – histograma

ggplot(diaM, aes(x=price)) + geom_histogram(binwidth=1000)

Y en función del corte…

ggplot(diaM, aes(x=price,fill=cut)) +
  geom_histogram(position='dodge',binwidth=1000)

En frecuencias relativas (por grupo)…

ggplot(diaM, aes(x=price,y=..density..,fill=cut)) +
  geom_histogram(position='dodge',binwidth=1000)

Quizás funcione mejor un gráfico de densidades…

ggplot(diaM, aes(x=price,fill=cut)) +
  geom_density(alpha=.3)

Gráficos en ggplot2 – diagrama de barras

ggplot(diaM, aes(x=clarity)) + geom_bar()

En función de la claridad…

ggplot(diaM, aes(x=clarity, fill=cut)) + geom_bar()

Para comparar entre frecuencias absolutas, funcionan mejor las barras separadas.

ggplot(diaM, aes(x=clarity, fill=cut)) + geom_bar(position="dodge")

Para comparar entre frecuencias relativas acumuladas, son mejores las barras apiladas en frecuencia relativa (para cada clase).

ggplot(diaM, aes(x=clarity, fill=cut)) + geom_bar(position="fill")

Los diagramas de barras también pueden crearse a partir de tablas de datos agrupados. En este caso, debe indicarse qué variable es la y e incluir stat="identity" en el geom_bar.

Gráficos en ggplot2 – diagrama de caja

ggplot(diaM, aes(x=1, y=price)) + geom_boxplot()

NOTA: Para el geom_boxplot se requieren dos variables. Si no hay variable independiente se puede incluir x=1.

Y en función del corte…

ggplot(diaM, aes(x=cut, y=price)) + geom_boxplot()

El gráfico se puede mejorar mostrando todos los puntos, con una posición aleatorizada.

ggplot(diaM, aes(x=cut, y=price)) + 
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(shape = 21, alpha=.5,height=0,width=.2)

O incluyendo un violin plot y un punto para la media…

medias <- diaM %>% group_by(cut) %>%
  summarise(price=mean(price))

ggplot(diaM, aes(x=cut, y=price)) + 
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1) +
  geom_point(data=medias,shape=3)

ggplot2 – elementos adicionales

Además de los elementos ya presentados (datos, mapeado estético y geometrías), otros elementos de ggplot2 permiten controlar aspectos adicionales del gráfico, por ejemplo

  • scale_...: controlan los aspectos relativos a la presentación de las variables del gráfico,
  • coord_...: establecen el sistema de coordenadas usado en la geometría,
  • labs: establece los títulos del gráfico,
  • theme, theme_...: controlan la part del gráfico que no corresponde a datos (non-data ink), y
  • facet_: permite la creació de secuencia de gráficos en función de una o dos variables

Un ejemplo para terminar…

ggplot(diaM, aes(x=carat, y = price, shape = cut, col = clarity)) +
  geom_point(alpha=.6) +
  scale_x_continuous(breaks=1:3) +
  scale_y_continuous(trans="log10") +
  scale_color_brewer(palette="Spectral")+
  facet_grid(cut ~ clarity) + 
  theme_bw() + 
  theme(legend.position = "none",text = element_text(size=10))

Estadística básica con R

Funciones de la estadística

La estadística, como parte de la matemática que se ocupa de la recolección, análisis e interpretación de datos, tiene dos funciones principales

  1. la descripción de conjuntos de datos (estadística descriptiva), y
  2. la extracción de conclusiones a partir de estos datos (inferencia)

En este repaso de la estadística básica, usaremos (de nuevo) el conjunto de datos mtcars.

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
head(mtcars, 10)
##                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

Descriptiva de una variable

A menudo, el primer interés que tendremos es el de describir un conjunto de datos correspondientes a una sola variable. Esta es la situación con la que empezaremos.

¿Cómo se describe un conjunto de datos univariante?

Normalmente se consideran los siguientes aspectos

  • frecuencias y cuantiles,
  • tendencia central (también llamado localización o posición),
  • dispersión, y
  • análisis de puntos extremos

Descriptiva de una variable – frecuencias y cuantiles

Tamaño de la muestra o número de datos

length(mtcars$disp)
## [1] 32
n <- sum(!is.na(mtcars$disp))
n
## [1] 32

Frecuencias absolutas y relativas

Para una variable cuantitativa (numeric)…

frec_abs <- table(cut(mtcars$disp,
      breaks=c(0,100,200,300,400,500,Inf)))
frec_abs
## 
##   (0,100] (100,200] (200,300] (300,400] (400,500] (500,Inf] 
##         5        11         5         8         3         0
frec_rel <- frec_abs / n
frec_rel
## 
##   (0,100] (100,200] (200,300] (300,400] (400,500] (500,Inf] 
##   0.15625   0.34375   0.15625   0.25000   0.09375   0.00000

Cuantiles

quantile(mtcars$disp,.1)
##   10% 
## 80.61
quantile(mtcars$disp,1:4*.2)
##    20%    40%    60%    80% 
## 120.14 160.00 275.80 350.80

Descriptiva de una variable – tendencia central

mean(mtcars$disp)
## [1] 230.7219
median(mtcars$disp)
## [1] 196.3

Descriptiva de una variable – dispersión

var(mtcars$disp) # el denominador es n-1
## [1] 15360.8
sd(mtcars$disp)
## [1] 123.9387
range(mtcars$disp)
## [1]  71.1 472.0
diff(range(mtcars$disp))
## [1] 400.9
IQR(mtcars$disp)
## [1] 205.175
mad(mtcars$disp) # mean absolute deviation
## [1] 140.4764

Descriptiva de una variable – puntos extremos

lmin <- quantile(mtcars$disp,.25) - 1.5*IQR(mtcars$disp) 
lmax <- quantile(mtcars$disp,.75) + 1.5*IQR(mtcars$disp) 
mtcars$disp[mtcars$disp > lmax | mtcars$disp < lmin]
## numeric(0)
lmin <- quantile(mtcars$qsec,.25) - 1.5*IQR(mtcars$qsec) 
lmax <- quantile(mtcars$qsec,.75) + 1.5*IQR(mtcars$qsec) 
mtcars$qsec[mtcars$qsec > lmax | mtcars$qsec < lmin]
## [1] 22.9

Descriptiva de una variable – gráficos

Gráficamente, son útiles para describir un conjunto de datos

  • para variables cuantitativas: el diagrama de caja y el histograma
boxplot(mtcars$qsec)
hist(mtcars$qsec)
  • para variables cualitativas: el diagrama de barras
barplot(table(factor(mtcars$cyl)))

Descriptiva de dos variables

Para el estudio y descripción de la relación entre dos variables, las técnicas más habituales incluyen

  • las tablas de contingencia,
  • los coeficientes de correlación, y muy especialmente el producto-momento de Pearson, y
  • los gráficos de dispersión

Descriptiva de dos variables – tabla de contingencia

Es el concepto equivalente a las tablas de frecuencias en el caso univariante.

Para variables cualitativas…

table(factor(mtcars$am),factor(mtcars$cyl))
##    
##      4  6  8
##   0  3  4 12
##   1  8  3  2

Para variables cuantitativas…

table(cut(mtcars$disp,breaks = seq(0,500,by=100)),
      cut(mtcars$qsec,breaks = seq(13,25,by=3)))
##            
##             (13,16] (16,19] (19,22] (22,25]
##   (0,100]         0       3       2       0
##   (100,200]       1       7       2       1
##   (200,300]       0       3       2       0
##   (300,400]       4       4       0       0
##   (400,500]       0       3       0       0

Descriptiva de dos variables – coeficiente de correlación

Producto-momento de Pearson

cor(mtcars$disp,mtcars$qsec)
## [1] -0.4336979

Coeficiente de correlación de Spearman

cor(mtcars$disp,mtcars$qsec, method = "spearman")
## [1] -0.4597818

Descriptiva de dos variables – gráfico de dispersión

plot(mtcars$disp,mtcars$qsec)

Distribuciones de probabilidad

La distribución de probabilidad de un número aleatorio corresponde a la abstracción teórica de la densidad de los datos de una conjunto. Representa la densidad que se obtendría cunado se generasen infinitos números aleatorios de acuerdos a un mismo procedimiento o experimento.

Un gran número de distribuciones experimentales tienen modelos teóricos con los que se relacionan. Los tres más comunes son la distribución normal (para datos de variables cuantitativas continuas), la distribución uniforme (para cualquier tipo de datos) y la distribución binomial (para el número de veces que se produce un suceso de una determinada probabilidad).

En R, todas las distribuiciones comparten el mismo sistema de funciones

  • r<dist>: genera aleatorios deacuerdo con una distribución de probabilidad
  • d<dist>: devuelve la densidad de probablidad para un valor de variable
  • q<dist>: devuelve el valor de la variable tal que la probablidad
  • p<dist>: devuelve la probablidad que un valor sea inferior o igual a x

Por ejemplo, para la distribución normal estándar…

rnorm(10)
##  [1] -0.43540370 -0.51658429  0.08029873 -0.80013265 -0.30665362
##  [6] -1.20757490  0.10710983  1.69543243 -0.16602575 -2.84271477
dnorm(0)
## [1] 0.3989423
qnorm(.95)
## [1] 1.644854
pnorm(1.64)
## [1] 0.9494974

Distribuciones de probabilidad - normal

df <- data.frame(x = rnorm(1000, mean = 3, sd = 1))
dfT <-data.frame(x = seq(0,6,length.out=101),
      y = dnorm(seq(0,6,length.out=101),mean=3,sd=1))
ggplot(df, aes(x = x, y=..density..)) +
  geom_histogram(binwidth = .1,fill="#dddddd",col="black") +
  geom_density() +
  geom_line(data=dfT,aes(x=x,y=y),col="red")+
  theme_bw()

pnorm(5,mean = 3,sd = 1)
## [1] 0.9772499
qnorm(.98,mean = 3,sd = 1)
## [1] 5.053749

Distribuciones de probabilidad - uniforme

df <- data.frame(x = runif(1000, min = 10, max = 20))
dfT <-data.frame(x = seq(10,20,length.out=101),
      y = dunif(seq(10,20,length.out=101), min=10, max=20))
ggplot(df, aes(x = x, y=..density..)) +
  geom_histogram(binwidth = .5,fill="#dddddd",col="black") +
  geom_density() +
  geom_line(data=dfT,aes(x=x,y=y),col="red")+
  theme_bw()

punif(12, min=10, max=20)
## [1] 0.2
qunif(.90, min=10, max=20)
## [1] 19

Distribuciones de probabilidad - binomial

df <- data.frame(x = rbinom(100,5,prob=0.5))
df <- df %>% group_by(x) %>%
  summarise(y = n()/nrow(df))
dfT <- data.frame(x = 0:5,
    y = dbinom(0:5,size=5,prob=0.5))

dfJ <- rbind(cbind(teo=FALSE,df),
             cbind(teo=TRUE,dfT))

ggplot(dfJ,aes(x=x,y=y,fill=teo)) +
  geom_bar(position="dodge", stat="identity",
           col="black") +
  theme_bw()

pbinom(2,5,prob=0.5)
## [1] 0.5
qbinom(.5,5,.5)
## [1] 2

Distribuciones de probabilidad – otras

R incorpora otras muchas distribuciones de probabilidad que pueden consultarse en la página correspondiente de la ayuda.

? "Distributions"

Inferencia

Inferencia – distribución

Inferencia – dispersión

Inferencia – localización

Ajuste de modelos

Ajuste de modelos – regresión lineal

Ajuste de modelos – comprobación

Importación y exportación de datos

Manipulación avanzada de tablas de datos